package capaServicios;

import implementacion.Comentarios;
import implementacion.Usuario;
import implementacion.Usuarios;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import capaPresentacion.shared.UsuarioDTO;

public class ServicioUsuario {

	private EntityManagerFactory emf;
	private EntityManager em;

	public ServicioUsuario() {
		emf = Persistence.createEntityManagerFactory("worldstrainer");
		em = emf.createEntityManager();
	}

	public void registrar(UsuarioDTO usuarioDTO) {
		Usuarios usuarios = new Usuarios(em);
		Usuario usuario = new Usuario(usuarioDTO.getNombre(),
				usuarioDTO.getApellidos(), usuarioDTO.getEmail(),
				usuarioDTO.getContrasenya(), usuarioDTO.getEdad(),
				usuarioDTO.getPeso(), usuarioDTO.getAltura());
		em.getTransaction().begin();
		usuarios.anyadirUsuario(usuario);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}

	public void darBaja(String email) {
		Usuarios usuarios = new Usuarios(em);
		em.getTransaction().begin();
		usuarios.eliminarUsuario(email);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}

	public boolean loguear(String email, String contrasenya) {
		Usuarios usuarios = new Usuarios(em);
		em.getTransaction().begin();
		boolean resultado = usuarios.autentificarUsuario(email, contrasenya);
		em.getTransaction().commit();
		em.close();
		emf.close();
		return resultado;
	}

	public void hacerAmigo(String emailUsuario, String emailAmigo) {
		Usuarios usuarios = new Usuarios(em);
		em.getTransaction().begin();
		usuarios.anyadirAmigo(emailUsuario, emailAmigo);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}

	public List<UsuarioDTO> buscarUsuarios(String cadena) {
		Usuarios usuarios = new Usuarios(em);
		em.getTransaction().begin();
		List<Usuario> usuariosAux = usuarios.buscarUsuario(cadena);
		List<UsuarioDTO> usuariosDTO = new ArrayList<UsuarioDTO>();
		for (Usuario usuario : usuariosAux)
			usuariosDTO.add(usuario.usuarioDTO());
		em.getTransaction().commit();
		em.close();
		emf.close();
		return usuariosDTO;
	}

	public List<UsuarioDTO> obtenerAmigos(String emailUsuario) {
		Usuarios usuarios = new Usuarios(em);
		em.getTransaction().begin();
		List<Usuario> amigos = usuarios.mostrarAmigos(emailUsuario);
		List<UsuarioDTO> amigosDTO = new ArrayList<UsuarioDTO>();
		for (Usuario usuario : amigos)
			amigosDTO.add(usuario.usuarioDTO());
		em.getTransaction().commit();
		em.close();
		emf.close();

		return amigosDTO;
	}

	public void hacerComentario(String texto, Date fecha, long idRuta,
			String emailUsuario) {
		Comentarios comentarios = new Comentarios(em);
		em.getTransaction().begin();
		comentarios.anyadirComentario(texto, fecha, idRuta, emailUsuario);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}

	public void borrarComentario(long idComentario) {
		Comentarios comentarios = new Comentarios(em);
		em.getTransaction().begin();
		comentarios.eliminarComentario(idComentario);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}

	public void deshacerAmigo(String emailUsuario, String emailAmigo) {
		Usuarios usuarios = new Usuarios(em);
		em.getTransaction().begin();
		usuarios.eliminarAmigo(emailUsuario, emailAmigo);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}

	public void modificarUsuario(UsuarioDTO usuarioDTO) {
		Usuarios usuarios = new Usuarios(em);
		Usuario usuario = new Usuario(usuarioDTO.getNombre(),
				usuarioDTO.getApellidos(), usuarioDTO.getEmail(),
				usuarioDTO.getContrasenya(), usuarioDTO.getEdad(),
				usuarioDTO.getPeso(), usuarioDTO.getAltura());
		em.getTransaction().begin();
		usuarios.modificarUsuario(usuario);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}

	public UsuarioDTO obtenerUsuario(String email) {
		Usuarios usuarios = new Usuarios(em);
		em.getTransaction().begin();
		Usuario usuario = usuarios.obtenerUsuario(email);
		UsuarioDTO usuarioDTO = usuario.usuarioDTO();
		em.getTransaction().commit();
		em.close();
		emf.close();
		return usuarioDTO;
	}

}
